#include "Principal.h"
#include "../lib/basicas.h"
#include "SDL/SDL.h"
#include "SDL/SDL_main.h"
/* programa principal */
int main(int argc, char *argv[]) {

	int rc = 0;
	int t = 0;
	SDL_Surface *Pantalla;
	SDL_Event evento;
	atexit(SDL_Quit);

	/*-- Limpio pantalla --*/
	system("clear");

	/*-- Inicializacion del mapa --*/
	init_mapa();

	sprintf(logMessageAux, "Inicializo Mapa de %d x %d", ALTO_MAPA, ANCHO_MAPA);
	//setLog(logMessageAux, INFO, NOMBREPROCESO);

	/*-- Inicializacion de se�ales --*/
	//startSignalHandler();
	//setLog("Inicializo Manejador de se�ales", INFO, NOMBREPROCESO);

	//setLog("Imprimo Mapa Inicializado",INFO, NOMBREPROCESO);
	Pantalla = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE|SDL_DOUBLEBUF);

	pintar_mapa(Pantalla);

	for (t = 0; t < NUM_MOTOS; t++) {

		/*-- Variables creacion de moto --*/
		char nombre_moto[128];
		int posicion_vector_moto = t;
		int id_moto = posicion_vector_moto + 1;
		int x, y;


		tabla_thr[posicion_vector_moto].id = id_moto;
		tabla_thr[posicion_vector_moto].estado = 1;
		strcpy(tabla_thr[posicion_vector_moto].nombre_moto, nombre_moto);

		do {
			srand((unsigned) time(0) * t + 3);
			x = rand() % ALTO_MAPA;

			srand((unsigned) time(0) * t + 7);
			y = rand() % ANCHO_MAPA;
		} while (mapa[x][y] != 0);

		tabla_thr[posicion_vector_moto].posX = x;
		tabla_thr[posicion_vector_moto].posY = y;
		actualizar_matriz(tabla_thr[posicion_vector_moto].posX,
				tabla_thr[posicion_vector_moto].posY,
				tabla_thr[posicion_vector_moto].id);
		sprintf(logMessageAux,
				"Inicializo Moto %d en vector: posicion (%d,%d)", id_moto,
				tabla_thr[posicion_vector_moto].posX,
				tabla_thr[posicion_vector_moto].posY);
		//setLog(logMessageAux, INFO, NOMBREPROCESO);

		/*-- pthread_create --*/
		rc = init_moto(&threads[posicion_vector_moto], posicion_vector_moto);

		if (rc) {
			printf("ERROR; return code from pthread_create() is %d\n", rc);
		}
	}
	init_colores(Pantalla);
	/*-- Bucle principal del main --*/
	while (estado_del_juego != FINALIZAR_JUEGO) {

		while (SDL_PollEvent(&evento)) {
			if (evento.type == SDL_QUIT) {
				printf("Exitt");
				SDL_FreeSurface(Pantalla);
				estado_del_juego = FINALIZAR_JUEGO;
			}
			if (evento.type == SDL_KEYDOWN) {
				printf("matando");
				switch (evento.key.keysym.sym) {

					case SDLK_UP:
						break; // Flecha arriba
					case SDLK_DOWN:
						break; // Flecha abajo
					case SDLK_LEFT:
						break; // Felcha izquierda
					case SDLK_RIGHT:
						break; // Flecha derecha
					case SDLK_RETURN:
						estado_del_juego = JUGAR;
						break; // Intro
					case SDLK_ESCAPE:
						break; // ESC
					case SDLK_p:
						estado_del_juego = PAUSA;
						break; // Tecla "p" (pausa)
					case SDLK_m:
						estado_del_juego = MATAR_MOTO;
						break; // Tecla "m" (mata!!)
					case SDLK_r:
						matar_moto = 1;
						id_debe_morir = 1;
						break;
					case SDLK_a:
						matar_moto = 1;
						id_debe_morir = 2;
						break;
					case SDLK_v:
						matar_moto = 1;
						id_debe_morir = 3;
						break;
				}
			}

		}

		char caracter;
		switch (estado_del_juego) {
			case JUGAR:
				pintar_mapa(Pantalla);
				break;
			case PAUSA:
				SDL_FillRect(Pantalla, NULL, SDL_MapRGB(Pantalla->format, 0, 0, 0));
				SDL_UpdateRect(Pantalla, 0, 0, 0, 0);
				break;
			case MATAR_MOTO:
				mata_moto(Pantalla);
				break;
		}

	}
	pthread_exit(NULL);

}

/*-- Funcion encargada de Pintar el Mapa --*/
void pintar_mapa(SDL_Surface *Pantalla) {
	int i;
	int j;
	int k;
	int r;
	Uint32 Color;
	SDL_Rect dest;

	if (i_JUGAR == NULL) {
		i_JUGAR = SDL_LoadBMP("src/jugar.bmp");
	}

	/*-- Pongo en cero el vector de logueo --*/
	/* memset((void *)logMessageAux,'\0', strlen(logMessageAux)); */

	for (i = 0; i < ALTO_MAPA; i++) {
		for (j = 0; j < ANCHO_MAPA; j++) {
			/* sprintf(logMessageAux, "%d", mapa[i][j]); */

			if (mapa[i][j] != 0) {
				switch (mapa[i][j]) {
				case 1:
					Color = ROJO;
					break;
				case 2:
					Color = AZUL;
					break;
				case 3:
					Color = VERDE;
					break;
				default:
					Color = BLANCO;
					break;
				}
				dest.x = 20 * i + 20;
				dest.y = 20 * j + 20;
				dest.w = 20;
				dest.h = 20;
				SDL_FillRect(Pantalla, &dest, Color);
			} else {
				dest.x = 20 * i + 20;
				dest.y = 20 * j + 20;
				dest.w = 20;
				dest.h = 20;
				SDL_FillRect(Pantalla, &dest, SDL_MapRGB(Pantalla->format, 0, 0, 0));
			}

		}
		/* sprintf(logMessageAux,"\n"); */
		/* setLog(logMessageAux,LOG, NOMBREPROCESO); */

	}

	for (k = 0; k < ALTO_MAPA + 1; k++) {

		dest.x = 20;
		dest.y = 20 * k + 20;
		dest.w = 20 * ALTO_MAPA;
		dest.h = 1;
		SDL_FillRect(Pantalla, &dest, SDL_MapRGB(Pantalla->format, 255, 255, 255));
	}
	for (r = 0; r < ANCHO_MAPA + 1; r++) {
		dest.x = 20 * r + 20;
		dest.y = 20;
		dest.w = 1;
		dest.h = 20 * ANCHO_MAPA;
		SDL_FillRect(Pantalla, &dest, SDL_MapRGB(Pantalla->format, 255, 255, 255));
	}
	dest.x = 560;
	dest.y = 20;
	dest.w = 60;
	dest.h = 220;
	SDL_BlitSurface(i_JUGAR, NULL, Pantalla, &dest);
	SDL_UpdateRect(Pantalla, 0, 0, 0, 0);
}
void init_colores(SDL_Surface *Pantalla) {
	ROJO = SDL_MapRGB(Pantalla->format, 255, 0, 0);
	AZUL = SDL_MapRGB(Pantalla->format, 0, 0, 255);
	VERDE = SDL_MapRGB(Pantalla->format, 0, 255, 0);
	BLANCO = SDL_MapRGB(Pantalla->format, 255, 255, 255);
}

/*-- Creo las motos --*/
int init_moto(pthread_t *thread, int posicion_vector_moto) {
	int rc, t;
	rc = pthread_create(thread, NULL, &functionC, &tabla_thr[posicion_vector_moto]);
	return rc;
}

/*-- Inicializa el mapa en cero --*/
void init_mapa() {
	int i, j;
	for (i = 0; i < ALTO_MAPA; i++)
		for (j = 0; j < ANCHO_MAPA; j++)
			mapa[i][j] = 0;
}

/*-- Limpia el rastro de la moto muerta --*/
void limpiar_rastros_moto( id_moto) {
	int i, j;

	sprintf(logMessageAux, "Limpio rastro de moto %d\n", id_moto);
	//setLog(logMessageAux, INFO, NOMBREPROCESO);

	for (i = 0; i < ALTO_MAPA; i++) {
		for (j = 0; j < ANCHO_MAPA; j++) {
			if (mapa[i][j] == id_moto)
				mapa[i][j] = 0;
		}
	}
}

/*--
 Chequea si las coordenadas estan libres
 Se hace aca porque el mapa es global
 --*/
void mata_moto(SDL_Surface *Pantalla) {

	SDL_Rect dest;

	if (i_MATA == NULL) {
		i_MATA = SDL_LoadBMP("src/mata.bmp");
	}
	dest.x = 200;
	dest.y = 190;
	dest.w = 240;
	dest.h = 100;
	SDL_BlitSurface(i_MATA, NULL, Pantalla, &dest);
	if (matar_moto == 1) {
		printf("matando");
		limpiar_rastros_moto(id_debe_morir);
		SDL_FillRect(Pantalla, NULL, SDL_MapRGB(Pantalla->format, 0, 0, 0));
		estado_del_juego = JUGAR;
		matar_moto = 0;
	}
	SDL_UpdateRect(Pantalla, 0, 0, 0, 0);
}
int coordenadasLibres(int x, int y, int moto_id, int flag_log) {
	if (mapa[x][y] == 0) {
		if (flag_log) {
			sprintf(logMessageAux, "LIBRE: Moto %d encontro libre (%d, %d)", moto_id, x, y);
			//setLog(logMessageAux, INFO, NOMBREPROCESO);
		}
		return TRUE;
	} else {
		if (flag_log) {
			sprintf(logMessageAux,
					"OCUPADA: Moto %d encontro ocupada (%d, %d) por %d",
					moto_id, x, y, mapa[x][y]);
			//setLog(logMessageAux, INFO, NOMBREPROCESO);
		}
		return FALSE;
	}
}

/*-- Actualiza Matriza con el id de moto --*/
void actualizar_matriz(int x, int y, int id) {
	char moto_file[12];
	/* pthread_mutex_lock(&mutex1);
	sprintf(moto_file, "moto_%d", id);
	sprintf(logMessageAux, "ACTUALIZA: Moto %d ubicada en (%d, %d)", id, x, y );
	setLog(logMessageAux, INFO, NOMBREPROCESO);
	*/

	mapa[x][y] = id;
	/* pthread_mutex_unlock(&mutex1); */
}

/*-- Funcion que ejecute el hilo de la moto --*/
void *functionC(T_Moto *datos) {

	while (estado_del_juego != FINALIZAR_JUEGO && datos->estado != 0) {
		switch (estado_del_juego) {
		case PAUSA:
			sprintf(logMessageAux, "PAUSA: Moto %d", datos->id);
			//setLog(logMessageAux, INFO, NOMBREPROCESO);
			break;
		case JUGAR:
			pthread_mutex_lock(&mutex1);
			mover_moto(datos->posX, datos->posY, datos->ultimo_mov, datos->id);
			pthread_mutex_unlock(&mutex1);
			break;
		}
	}
	pthread_exit(NULL);
}

